﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using Estructuras.Comunes;

namespace Estructuras.Consola.ConsolaCrearEstadisticas
{
    /// <summary>
    /// Almacena las propiedades de un elemento específico.
    /// </summary>
    public class PCrearEstadisticas : Propiedades
    {
        /// <summary>
        /// Valor por defecto de la propiedad SobrescribirSalida
        /// </summary>
        private const bool ValorDefectoSobrescribirSalida = false;

        /// <summary>
        /// Entrada de datos.
        /// </summary>
        public string Entrada
        {
            get
            {
                return this.getPropiedadString(CCrearEstadisticas.Entrada);
            }
            set
            {
                this.setOrAddPropiedad(CCrearEstadisticas.Entrada, value);
            }
        }

        /// <summary>
        /// Salida de datos.
        /// </summary>
        public string Salida
        {
            get
            {
                return this.getPropiedadString(CCrearEstadisticas.Salida);
            }
            set
            {
                this.setOrAddPropiedad(CCrearEstadisticas.Salida, value);
            }
        }

        /// <summary>
        /// Estructura de entrada.
        /// </summary>
        public string EstructuraEntrada
        {
            get
            {
                return this.getPropiedadString(CCrearEstadisticas.EstructuraEntrada);
            }
            set
            {
                this.setOrAddPropiedad(CCrearEstadisticas.EstructuraEntrada, value);
            }
        }

        /// <summary>
        /// Estructura de salida.
        /// </summary>
        public string EstructuraSalida
        {
            get
            {
                return this.getPropiedadString(CCrearEstadisticas.EstructuraSalida);
            }
            set
            {
                this.setOrAddPropiedad(CCrearEstadisticas.EstructuraSalida, value);
            }
        }

        /// <summary>
        /// Fichero de definición de estadísticas.
        /// </summary>
        public string FicheroEstadisticas
        {
            get
            {
                return this.getPropiedadString(CCrearEstadisticas.FicheroEstadisticas);
            }
            set
            {
                this.setOrAddPropiedad(CCrearEstadisticas.FicheroEstadisticas, value);
            }
        }

        /// <summary>
        /// Fichero de salida de estadísticas.
        /// </summary>
        public string SalidaEstadisticas
        {
            get
            {
                return this.getPropiedadString(CCrearEstadisticas.SalidaEstadisticas);
            }
            set
            {
                this.setOrAddPropiedad(CCrearEstadisticas.SalidaEstadisticas, value);
            }
        }

        /// <summary>
        /// Nombre del grupo de estadísticas.
        /// </summary>
        public string NombreEstadisticas
        {
            get
            {
                return this.getPropiedadString(CCrearEstadisticas.NombreEstadisticas);
            }
            set
            {
                this.setOrAddPropiedad(CCrearEstadisticas.NombreEstadisticas, value);
            }
        }

        /// <summary>
        /// Indicador sobrescritura fichero de salida.
        /// </summary>
        public bool SobrescribirEstadistica
        {
            get
            {
                bool? dato = this.getPropiedadBool(CCrearEstadisticas.SobrescribirEstadistica);
                if (dato == null)
                    return ValorDefectoSobrescribirSalida;
                return (bool)dato;
            }
            set
            {
                this.setOrAddPropiedad(CCrearEstadisticas.SobrescribirEstadistica, value);
            }
        }

        /// <summary>
        /// Constructor por defecto.
        /// </summary>
        public PCrearEstadisticas()
            : base()
        {
        }

        /// <summary>
        /// Obtiene los parámetros a partir del fichero XML indicado.
        /// </summary>
        /// <param name="fichero">Fichero de configuración XML</param>
        override public void leer(string fichero)
        {
            base.leer(fichero);
            XmlDocument xml = LeerXml.AbrirFicheroParametros(fichero);
            this.Entrada = LeerXml.ObtenerValorCampo(xml, CCrearEstadisticas.RutaEntrada);
            this.Salida = LeerXml.ObtenerValorCampo(xml, CCrearEstadisticas.RutaSalida);
            this.EstructuraEntrada = LeerXml.ObtenerValorCampo(xml, CCrearEstadisticas.RutaEstructuraEntrada);
            this.EstructuraSalida = LeerXml.ObtenerValorCampo(xml, CCrearEstadisticas.RutaEstructuraSalida);
            this.FicheroEstadisticas = LeerXml.ObtenerValorCampo(xml, CCrearEstadisticas.RutaFicheroEstadisticas);
            this.SalidaEstadisticas = LeerXml.ObtenerValorCampo(xml, CCrearEstadisticas.RutaSalidaEstadisticas);
            this.NombreEstadisticas = LeerXml.ObtenerValorCampo(xml, CCrearEstadisticas.RutaNombreEstadistica);
            this.SobrescribirEstadistica = bool.Parse(LeerXml.ObtenerValorCampo(xml, CCrearEstadisticas.RutaSobrescribirEstadistica));
        }

        /// <summary>
        /// Obtiene la definición de las estadísticas del fichero de estadísticas indicado.
        /// </summary>
        /// <param name="ficheroEstadisticas">Fichero de estadísticas</param>
        /// <returns>Definición de estadísticas</returns>
        public Dictionary<string, string> leerEstadisticas(string ficheroEstadisticas)
        {
            Dictionary<string, string> estadisticas = new Dictionary<string, string>();
            XmlDocument xml = null;
            try
            {
                xml = LeerXml.AbrirFicheroParametros(ficheroEstadisticas);
            }
            catch (Exception)
            {
                throw new Excepcion(Constantes.ERROR_CARGAR_FICHERO_DEFINICION_ESTADISTICAS, Constantes.CODIGO_ERROR_CARGAR_FICHERO_DEFINICION_ESTADISTICAS);
            }
            try
            {
                int numeroEstadisticas = LeerXml.ObtenerNumeroNodosCampo(xml, CCrearEstadisticas.RutaNodoRaizEstadísticas);
                for (int i = 0; i < numeroEstadisticas; i++)
                {
                    string nombre_estadistica = LeerXml.ObtenerValorCampo(xml, CCrearEstadisticas.RutaNodoRaizEstadísticas, i, "./" + CCrearEstadisticas.NodoEstadisticaNombre);
                    string regla_estadistica = LeerXml.ObtenerValorCampo(xml, CCrearEstadisticas.RutaNodoRaizEstadísticas, i, "./" + CCrearEstadisticas.NodoEstadisticaRegla);
                    if (!string.Empty.Equals(nombre_estadistica) || !string.Empty.Equals(regla_estadistica))
                        estadisticas.Add(nombre_estadistica, regla_estadistica);
                }
                return estadisticas;
            }
            catch (Exception)
            {
                throw new Excepcion(Constantes.ERROR_OBTENER_DEFINICION_ESTADISTICAS, Constantes.CODIGO_ERROR_OBTENER_DEFINICION_ESTADISTICAS);
            }
        }
    }
}
